% coding: utf-8

\subsection{Conversión de la gramática}
\subsubsection{Sobre la asociatividad}

\indent La asociatividad de los operadores la resolvemos en la TDS. Los operadores resta, división y potenciación deben tener asociatividad izquierda para un correcto cálculo de las expresiones. Los operadores más y por no importa la asociatividad que les demos, su cálculo será correcto ya que es lo mismo de cualquier forma que se asocie. Como debemos darle alguna y las otras son asociativas a izquierda hicimos que todas sean asociativas a izquierda a modo de simplificar la gramática. Es decir se van resolviendo de izquierda a derecha. Luego la sentencia ''$3+4-5+6$;'' es equivalente a la sentencia ''$((3+4)-5)+6$;''.

\indent Ejemplo análogo a nuestra resolución, a modo de mostrar cómo resolvemos la asociatidad a izquierda en la TDS:
Sea ''e'' un símbolo no terminal con un atributo llamado valor y la producción ''e $\rightarrow$ e ($-$ e)$\ast$''. 
Luego para darle una asociatividad a izquierda nosotros hacemos lo siguiente:
''e1 $\rightarrow$ e2 $\lbrace$ e1.valor $=$ e2.valor; $\rbrace$ ($-$ e3 $\lbrace$ e1.valor $-=$ e3.valor;$\rbrace$)$\ast$''. Se puede ver que el valor resultante comienza siendo el valor de la primer ''e'' a izquierda y luego se va actualizando por cada ''$-$e'' que aparezca.

\subsubsection{Sobre la precedencia}
\indent La precedencia se resuelve correctamente utilizando el modo visto en clase. Mostramos un ejemplo análogo a nuestra resolución, a modo de mostrar cómo resolvemos la precedencia de los operadores. Sea la gramática 

$< V_N, V_T, S, P >$ donde\\
$V_T$ = \{ id, (, ) \} \\
$V_N$ = \{ S, OpMayorPre, OpMediaPre, OpMenorPre \} \\
\textit{P:} \\
S $\rightarrow$ S OpMayorPre S $\mid$ S OpMediaPre S $\mid$ S OpMenorPre S $\mid$ (S) $\mid$ id\\

Luego la convertimos a (Obviar la asociatividad):\\

\textit{P:}\\
\indent S $\rightarrow$ S OpMenorPre S1\\
\indent S1 $\rightarrow$ S1 OpMediaPre S2\\
\indent S2 $\rightarrow$ S2 OpMayorPre S3\\
\indent S3 $\rightarrow$ (S) $\mid$ id\\
De este modo el orden de valuación respeta la precedencia de los operadores.


\subsubsection{Sobre los tokens ENTERO y NUMERO}
\indent La gramática original incluía los símbolos terminales NUMERO y ENTERO. Estos representan los números reales (R) y los enteros (Z) respectivamente. Esto trae dos problemas en la gramática. El primer problema es el solapamiento de los dominios de estos símbolos terminales. Si nosotros hacemos que nuestros tokens NUMERO y ENTERO representen exactamente lo que representan los símbolos mencionados de la gramática original, sucedería una de las siguientes: 
\begin{enumerate}
\item El analizador léxico reconocería los números enteros (Z) como ENTERO
\item El analizador léxico reconocería los números enteros (Z) como NUMERO
\end{enumerate}

\indent En el primer caso de modo de reconocer la cadena ''3 $+$ 4;'' se debe agregar la producción e4 $\rightarrow$ ENTERO, ya que tal cadena genera la secuencia de tokens ''ENTERO WS SUMA WS ENTERO DOTCOM''.
En el segundo caso de modo de reconocer la cadena ''3 $\wedge$ 4;'' se debe agregar la producción e3 $\rightarrow$ e4($\wedge$ NUMERO)$\ast$ y además no dejar que ese n\'umero sea decimal, ya que tal cadena genera la secuencia de tokens ''NUMERO WS POT WS NUMERO DOTCOM''. En particular ocurre el caso 1.

\indent La solución por la que optamos fue hacer disjuntos los dominios de nuestros token ENTERO y NUMERO. Representando los enteros (Z) y los racionales menos los enteros (R $\setminus$ Z) respectivamente. Luego agregamos la producción e4 $\rightarrow$ ENTERO, ya que e4 $\rightarrow$ NUMERO no cubre todos los números racionales.
El segundo problema sucede por el símbolo menos adelante de un número.
Si permitimos que los tokens ENTERO o NUMERO puedan representar un número negativo luego la cadena ''3 $-$4;'' haría que el lexer genere la secuencia de token ''ENTERO WS ENTERO DOTCOM''. Luego esta secuencia de token hace que se utilice la producción con la multiplicación implícita en vez de la producción con la resta que es el comportamiento esperado de ''3$-$4''.

\indent Luego optamos por quitar los números negativos del dominio de los tokens ENTERO y NUMERO. Representando los enteros (Z) mayores o iguales a cero y los racionales menos los enteros mayores o iguales que cero (R $\setminus$ Z) respectivamente. De este modo la cadena ''3 $-$4;'' haría que el lexer genere la secuencia de token ''ENTERO WS MENOS ENTERO DOTCOM'', como deseamos. Este cambio requiere que agreguemos en la producción de potencia la posibilidad de que tenga el token MENOS antes del entero, por eso tenemos la producción e3 $\rightarrow$ e4($\wedge$ MENOS? ENTERO)$\ast$. Y no requiere más cambios en la gramática, dado que los números negativos se generan utilizando la producción que niega: e2 $\rightarrow$ $-^{*}$e3.

\subsubsection{Sobre la producción e1 (Anteriormente con conflicto LL1)}
\indent Actualmente   e1 : e2 (('$\ast$' $\mid$ '/' ) e2 $\mid$ e3)$\ast$;\\
Anteriormente e1 : e2 (('$\ast$'$\mid$ '/' )? e2)$\ast$;\\
Producciones con las que se relaciona:\\
expr 	:	e1 (('$+$'$\mid$ '$-$' ) e1)$\ast$;\\
e2 	    :	'$-^{*}$' e3;\\

\indent Anteriormente teníamos un conflicto LL1. Al terminar de leer e2 cuando viene el token MENOS, no sabe si éste pertenece al MENOS de expr o de e2. Como la operación correcta a realizar de la secuencia ''a $-$ a;'' es la resta, modificamos la producción e1 de modo que si vienen dos expresiones seguidas, la segunda no empiece con un MENOS. Esto se logra haciendo que la segunda expresión vaya directamente a e3, no teniendo la posibilidad de comenzar con un MENOS. Así luego de leer e2 cuando viene el token MENOS, su única opción es reducir a e1 y tomar el MENOS de expr realizando la operación resta.

\subsubsection{Sobre la potencia}
\indent En un principio nuestra gramática aceptaba y calculaba correctamente la cadena ''(2$\wedge$3)$\wedge$4;'' pero no la cadena ''2$\wedge$3$\wedge$4;''. Ahora bien, en una calculadora ambas expresiones representan el mismo valor. Además la propiedad asociativa no se cumple para la potenciación. Es decir (2$\wedge$3)$\wedge$4 es distinto de 2$\wedge$(3$\wedge$4). Luego tomamos la decisión de que la gramática acepte y calcule correctamente la cadena ''2$\wedge$3$\wedge$4;'' y que su valor sea el mismo que el de la cadena ''(2$\wedge$3)$\wedge$4;''. Por esto tenemos la producción ''e3 $\rightarrow$ e4($\wedge$ MENOS? ENTERO)$\ast$'' en vez de ''e3 $\rightarrow$ e4($\wedge$ MENOS? ENTERO)?''.

\subsubsection{Sobre la negación}
\indent De forma análoga a la potencia, en un principio nuestra gramática aceptaba y calculaba correctamente la cadena ''$-(-(-2))$;'' pero no aceptaba ''$---2$;''. Luego de analizar y discutir decidimos que la cadena ''$---2$;'' debía ser aceptada y calculada como en cualquier calculadora.


\subsubsection{Pasos para la conversión de la gramática}
\textbf{Gramática original:} \\
G = $< V_N, V_T, P, Programa >$ donde \\
$V_N$ = \{$Programa, Sentencias, Sentencia, Identificadores, Expr$\} \\
$V_T$ = \{$, ;, unidades, var, id, =, +, -, *, /, \wedge, entero, , ,numero$\} \\
\textit{P:} \\
\indent Programa $\rightarrow$ Sentencias \\
\indent Sentencias $\rightarrow$ Sentencia ; Sentencias $\mid$ $\lambda$\\
\indent Sentencia $\rightarrow$ unidades Identificadores $\mid$ var id $=$ Expr $\mid$ Expr \\
\indent Identificadores $\rightarrow$ id $\mid$ Identificadores, id \\
\indent Expr $\rightarrow$ Expr $+$ Expr $\mid$ Expr $-$ Expr $\mid$ Expr $*$ Expr $\mid$ Expr Expr $\mid$ Expr $/$ Expr $\mid$ $-$ Expr $\mid$ Expr $\wedge$ entero $\mid$ numero $\mid$ id $\mid$ (Expr) \\
\\
Lo primero que hicimos fue quitar la ambigüedad en Expr, teniendo en cuenta las precedencias de los operadores: \\
G1 = $< V_N1, V_T1, P1, Programa >$ donde \\
$V_N1$ = \{$Programa, Sentencias, Sentencia, Identificadores, Expr, E1,E2,E3,E4$\} \\
$V_T1$ = \{$, ;, unidades, var, id, =, +, -, *, /, \wedge, entero, , ,numero$\} \\
\textit{P1:} \\
\indent Programa $\rightarrow$ Sentencias \\
\indent Sentencias $\rightarrow$ Sentencia ; Sentencias $\mid$ $\lambda$\\
\indent Sentencia $\rightarrow$ unidades Identificadores $\mid$ var id $=$ Expr $\mid$ Expr \\
\indent Identificadores $\rightarrow$ id $\mid$ Identificadores, id \\
\indent Expr $\rightarrow$ Expr $+$ E1 $\mid$ Expr $-$ E1 $\mid$ E1 \\
\indent E1 $\rightarrow$ E1 $*$ E2 $\mid$ E1 E2 $\mid$ E1 $/$ E2 $\mid$ E2 \\
\indent E2 $\rightarrow$ $-$ E3 $\mid$ E3 \\
\indent E3 $\rightarrow$ E4 $\wedge$ entero $\mid$ E4 \\
\indent E4 $\rightarrow$ numero $\mid$ id $\mid$ (Expr) \\
\\
Luego convertimos la gramática a una extendida, de la siguiente forma:\\
G2 = $< V_N2, V_T2, P2, Programa >$ donde \\
$V_N2$ = \{$Programa, Sentencia, Identificadores, Expr, E1,E2,E3,E4$\} \\
$V_T2$ = \{$;, unidades, var, id, =, +, -, *, /, \wedge, entero, , ,numero$\} \\
\textit{P2:} \\
\indent Programa $\rightarrow$ (Sentencia;)$^{*}$  \\
\indent Sentencia $\rightarrow$ unidades Identificadores $\mid$ var id = Expr $\mid$ Expr \\
\indent Identificadores $\rightarrow$ id (, id)$^{*}$ \\
\indent Expr $\rightarrow$ E1 ((+ $\mid$ -)E1)$^{*}$ \\
\indent E1 $\rightarrow$  E2 ( (* $\mid$ /) E2 $\mid$ E3)$^{*}$ \\
\indent E2 $\rightarrow$ $-^{*}$ E3 \\
\indent E3 $\rightarrow$ E4 ($\wedge$ ($-$)? entero)$^{*}$ \\
\indent E4 $\rightarrow$ entero $\mid$ numero $\mid$ id $\mid$ (Expr) \\


